home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / windows / comms / recomm10.arj / RECOMNET.C < prev    next >
C/C++ Source or Header  |  1993-10-12  |  17KB  |  792 lines

  1. #define MAIN
  2.  
  3. #define CFILES 
  4. #include "recomnet.h"  
  5. #include <stdlib.h>
  6. #include <dos.h>
  7.  
  8. #define WM_NB_RESPONSE WM_USER +2000 
  9.  
  10. #include <dblevel.h>
  11.  
  12. #define WM_DEBUG WM_USER + 101
  13. BOOL IN_DEBUG = FALSE;
  14.  
  15. BOOL FAR __cdecl CL_DEBUG( UINT DebugNr, char huge *szFormat, ...)
  16. {
  17.     static char szBuffer[200];
  18.     HWND hDebug;
  19.     LPSTR pArgs;
  20.     
  21.     hDebug = FindWindow("HKR_DEBUG_WND", NULL);
  22.     if(hDebug == (HWND)NULL)
  23.     {
  24.         return FALSE;
  25.     }
  26.     if(IN_DEBUG == TRUE) return FALSE;
  27.     IN_DEBUG = TRUE;
  28.     
  29.     pArgs = (LPSTR)&szFormat + sizeof(szFormat);
  30.     wvsprintf( szBuffer, szFormat, pArgs );
  31.     SendMessage(hDebug, WM_DEBUG, DebugNr, (LPARAM)(LPSTR)szBuffer);
  32.     
  33.     IN_DEBUG = FALSE;
  34.     return TRUE;
  35. }
  36. typedef struct {
  37.     BYTE cLSN;
  38.     BYTE cNum;
  39.     char szName[17];
  40.     char szServer[80];
  41.     BYTE Adapter;    
  42.     
  43. } DATA, FAR * LPDATA;
  44.  
  45. DATA clData;
  46. int net_errno;
  47.  
  48. BOOL NET_INIT = FALSE;
  49.  
  50. #pragma optimize( "", off)
  51.  
  52. void getNetBiosName(LPSTR name)
  53. {                 
  54.     register x, y;
  55.                 
  56.     extern void FAR PASCAL DOS3Call();
  57.  
  58.     x = _FP_SEG(name);
  59.     __asm mov ds, x;
  60.     y = _FP_OFF(name);
  61.     __asm mov dx, y;
  62.     __asm mov ah, 0x5e ;
  63.     __asm mov al, 0x00 ;
  64.     
  65.     DOS3Call();
  66. }
  67.  
  68. #pragma optimize( "", on)    
  69.     
  70.  
  71. ERROR_MSG( LPSTR fnctxt)
  72. {
  73.     char errtxt[200];       
  74.     
  75.     wsprintf(errtxt, "FEHLER: WΣhrend %s trat\n%s auf.", (LPSTR)fnctxt, (LPSTR)WNB_Error());
  76.     return (MessageBox(NULL, errtxt, APPTITLE, 
  77.     MB_ABORTRETRYIGNORE|MB_ICONHAND));
  78. }
  79.  
  80. void setReadyFlag()
  81. {
  82.     FARPROC lpfn;
  83.     HINSTANCE hLib;
  84.     
  85.     hLib = LoadLibrary("COMM");
  86.     
  87.     if(hLib > HINSTANCE_ERROR)
  88.     {
  89.         
  90.         lpfn = (FARPROC)GetProcAddress(hLib, "setRemoteRunning");
  91.         if(lpfn != (FARPROC)NULL)
  92.         {
  93.             (*lpfn)(event);
  94.             return;
  95.         }                                                
  96.     }
  97.     
  98.     MessageBox(NULL, "ACHTUNG: Beim benutzen von RemoteCommPort\n"
  99.     "trat folgender Fehler auf:\n"
  100.     "COMM.DRV not found", APPTITLE, 
  101.     MB_OK|MB_ICONHAND);
  102. }            
  103. exitDlg(HWND hDlg, HBRUSH hBrush, LPNCB brdNCB, UINT status)
  104. {
  105.     
  106.         KillTimer(hDlg, 2);
  107.         DeleteObject(hBrush);
  108.         
  109.         if(brdNCB != NULL)
  110.         {
  111.             Cancel(clData.Adapter, brdNCB);
  112.         }
  113.         // CL_DEBUG(DB_ACTION, "CLIENT: HOSTDLG CLOSE");
  114.         
  115.         EndDialog(hDlg, status);
  116.         return TRUE;
  117. }    
  118.  
  119. BOOL FAR PASCAL HostDlgProc(HWND hDlg, WORD message,
  120. WORD wParam, LONG lParam)
  121. {    
  122.     static char hostaddr[80];
  123.     char tmp[80];
  124.     int rc;
  125.     static int timer;
  126.     DWORD x;
  127.     static HBRUSH hBrush;
  128.     static LPNCB fndNCB = NULL;
  129.     
  130.     int lpTab[4] =
  131.     {    20, 80, 110, 220
  132.     };
  133.     
  134.     
  135.     switch (message)
  136.     {
  137.     case WM_INITDIALOG:  
  138.         
  139.         clData.szServer[0] = '\0';
  140.         
  141.         if(GetPrivateProfileString("HOST", "USE", "", hostaddr, 
  142.             sizeof(hostaddr), "recomm.ini") > 0)
  143.         {
  144.             // CL_DEBUG(DB_ACTION, "CLIENT: FIX HOST %s", (LPSTR)hostaddr);
  145.             lstrcpy(clData.szServer, hostaddr);
  146.             EndDialog(hDlg, IDOK);
  147.             return TRUE;                
  148.         }
  149.         hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  150.         
  151.         SendDlgItemMessage(hDlg, IDD_LISTE, LB_RESETCONTENT, 0, 0L);
  152.                 
  153.         SendDlgItemMessage (hDlg, IDD_LISTE, LB_SETTABSTOPS,
  154.         (WPARAM) 4,(LPARAM) (int huge *) lpTab);
  155.                    
  156.         timer = 10;                   
  157.         wsprintf(tmp, "%d", timer);
  158.         SetDlgItemText(hDlg, IDD_TIMER, tmp);
  159.         SetTimer(hDlg, 2, 2000, 0L);
  160.         
  161.         rc = PostReceiveDatagram(clData.Adapter, clData.cNum, 
  162.               (LPSTR)&fndSrv, sizeof(fndSrv), hDlg, WM_NB_RESPONSE, 1, &fndNCB);
  163.                    
  164.         SendBroadcast(WAIT_WND_MODAL, clData.Adapter, clData.cNum, (LPSTR)&fndSrv, 
  165.             sizeof(fndSrv), hDlg);
  166.             
  167.         return TRUE;    
  168.         
  169.     case WM_NB_RESPONSE:
  170.         lpNCB = (LPNCB) lParam;
  171.         
  172.         
  173.         if(lpNCB->cCmdCplt)
  174.         {
  175.             // CL_DEBUG(DB_ACTION, "FIND SERVER: NB_RESPONSE (0x%x)", lpNCB->cCmdCplt);
  176.             DestroyNCB(lpNCB);
  177.             return 0;
  178.         }
  179.         switch(lpNCB->cCommand & ~NO_WAIT)
  180.         {
  181.                     
  182.             case NETBIOS_RECEIVE_DATAGRAM:
  183.                 
  184.                 lstrcpy(tmp, fndSrv.name);
  185.                 
  186.                 if(fndSrv.stat == TRUE)
  187.                 {
  188.                     lstrcat(tmp, "\t belegt");
  189.                 }
  190.                 DestroyNCB(lpNCB);
  191.                 
  192.                 rc = PostReceiveDatagram(clData.Adapter, clData.cNum, 
  193.                       (LPSTR)&fndSrv, sizeof(fndSrv), hDlg, WM_NB_RESPONSE, 1, &fndNCB);
  194.                 
  195.                 SendDlgItemMessage(hDlg, IDD_LISTE, LB_ADDSTRING, 0, (LPARAM)(LPSTR)tmp);
  196.                    
  197.                 timer = 10;
  198.                 wsprintf(tmp, "%d", timer);
  199.                 SetDlgItemText(hDlg, IDD_TIMER, tmp);
  200.             
  201.                 KillTimer(hDlg, 2);
  202.                 SetTimer(hDlg, 2, 2000, 0L);
  203.         
  204.                 if(GetPrivateProfileString("HOST", "LAST", "", tmp, 
  205.                 sizeof(tmp), "recomm.ini") > 0)
  206.                 {
  207.                     x = SendDlgItemMessage(hDlg, IDD_LISTE, LB_SELECTSTRING, (WPARAM)-1,(LPARAM)(LPSTR)tmp);
  208.                     SendDlgItemMessage(hDlg, IDD_LISTE, LB_SETCURSEL,(WPARAM)x, 0L);
  209.                 }           
  210.                 return TRUE;        
  211.         }
  212.         DestroyNCB(lpNCB);
  213.         return TRUE;        
  214.         
  215.     case WM_CTLCOLOR:
  216.         switch(HIWORD(lParam))
  217.         {
  218.             case CTLCOLOR_DLG:
  219.             case CTLCOLOR_STATIC:
  220.                 SetBkColor((HDC)wParam, GetSysColor(COLOR_BTNFACE));
  221.                 return(hBrush);
  222.         }
  223.         return 0L;
  224.         
  225.     case WM_TIMER:
  226.         wsprintf(tmp, "%d", --timer);
  227.         SetDlgItemText(hDlg, IDD_TIMER, tmp);
  228.         
  229.         if(timer == 0)
  230.         {
  231.             x = SendDlgItemMessage(hDlg, IDD_LISTE, LB_GETCURSEL, 0, (LPARAM)0L);        
  232.             
  233.             if(x == LB_ERR) 
  234.             {
  235.                 // CL_DEBUG(DB_ACTION, "CLIENT: TIMEOUT & NO HOST");
  236.                 EndDialog(hDlg, IDCANCEL);
  237.                 return TRUE;
  238.             }
  239.             
  240.             SendDlgItemMessage(hDlg, IDD_LISTE, LB_GETTEXT, (WPARAM)x, (LPARAM)(LPSTR)hostaddr);
  241.             
  242.             lstrcpy(clData.szServer, hostaddr);
  243.             
  244.             // CL_DEBUG(DB_ACTION, "CLIENT: TIMEOUT HOST %s", (LPSTR)hostaddr);
  245.             
  246.             exitDlg(hDlg, hBrush, fndNCB, IDOK);
  247.             return TRUE;                
  248.         }
  249.         return TRUE;            
  250.         
  251.         
  252.     case WM_COMMAND:
  253.         switch(wParam)
  254.         {    
  255.         case IDOK:
  256.         case IDD_LISTE:
  257.             if( (HIWORD(lParam) == LBN_DBLCLK)
  258.             || (wParam == IDOK))
  259.             {
  260.                 x = SendDlgItemMessage(hDlg, IDD_LISTE, LB_GETCURSEL, 0, (LPARAM)0L);        
  261.                 SendDlgItemMessage(hDlg, IDD_LISTE, LB_GETTEXT, (WPARAM)x, (LPARAM)(LPSTR)hostaddr);
  262.                 
  263.                 WritePrivateProfileString("HOST", "LAST", hostaddr, "recomm.ini");
  264.                 
  265.                 lstrcpy(clData.szServer, hostaddr);
  266.                 
  267.                 // CL_DEBUG(DB_ACTION, "CLIENT: HOST %s", (LPSTR)hostaddr);
  268.                 
  269.                 exitDlg(hDlg, hBrush, fndNCB, IDOK);
  270.             }
  271.             return TRUE;                
  272.             
  273.         case IDCANCEL:      
  274.             exitDlg(hDlg, hBrush, fndNCB, IDCANCEL);
  275.             return TRUE;
  276.         }
  277.         break;
  278.     }
  279.     return FALSE;
  280. }       
  281. handleMessage()
  282. {
  283.     MSG msg;
  284.     
  285.     while(PeekMessage(&msg, HwnD, 0, 0, PM_REMOVE))
  286.     {
  287.         if(msg.message == WM_QUIT) return FALSE;
  288.         
  289.         TranslateMessage(&msg);
  290.         DispatchMessage(&msg);
  291.     }   
  292.     return TRUE;
  293. }
  294.  
  295. conectToHost()
  296. {    
  297.     
  298.     int rc;
  299.     
  300. CONECT_RETRY:
  301.     
  302.     // CL_DEBUG(DB_ACTION, "CLIENT: WAIT CONNECT (%s)", (LPSTR)clData.szServer);
  303.     
  304.     CONECTED = FALSE;
  305.     
  306.     rc = Call(WAIT_APP_MODAL, clData.szName, clData.szServer, 
  307.             clData.Adapter, 30, 30, HwnD, (LPBYTE)&clData.cLSN);
  308.             
  309.     if(rc != 0)
  310.     {
  311.         net_errno = rc;
  312.         // CL_DEBUG(DB_ACTION, "CLIENT: CALL ERROR %s", (LPSTR)WNB_Error());
  313.         return FALSE;
  314.     }            
  315.     // CL_DEBUG(DB_ACTION, "CLIENT: WAIT RESPONSE");
  316.                 
  317.     if((rc = readAnswer()) != 0)
  318.     {
  319.         // CL_DEBUG(DB_ACTION, "CLIENT: CONNECT DATA %s", (LPSTR)WNB_Error());
  320.         CONECTED = FALSE;
  321.         if(rc == IDRETRY) goto CONECT_RETRY;
  322.         
  323.         return FALSE;
  324.     }   
  325.     CONECTED = TRUE;
  326.     
  327.     evtick = GetTickCount();        
  328.     event = 0;
  329.     
  330.     SetWindowText(HwnD, clData.szServer);
  331.     
  332.     // CL_DEBUG(DB_ACTION, "CLIENT: CONECT OK"); 
  333.     
  334.     return TRUE;
  335. }        
  336. int FAR PASCAL initRecomNet()
  337. {
  338.     
  339.     HWND hwnd;
  340.     HMENU hmenu;
  341.     char tmp[30];
  342.     char * c1;
  343.     int rc;
  344.     
  345.     hmenu = CreateMenu();
  346.     AppendMenu(hmenu, MF_STRING, IDABORT, "Disconect");
  347.     
  348.     HwnD = hwnd = CreateWindow(szAppName, APPTITLE,
  349.         WS_OVERLAPPEDWINDOW, 0, 0, 30, 100, HWND_DESKTOP, hmenu, hLibrary, NULL);
  350.     
  351.     // CL_DEBUG(DB_ACTION, "CLIENT HWND %d", hwnd);
  352.     
  353.     ShowWindow(hwnd, SW_SHOWMINNOACTIVE);
  354.     SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
  355.                         
  356.     if(NET_INIT     == FALSE) 
  357.     {
  358.         NET_INIT = !NET_INIT;
  359.         
  360.         clData.Adapter = 0;
  361.         getNetBiosName(tmp);
  362.         
  363.         wsprintf(clData.szName, "RC_%12s", (LPSTR)tmp);
  364.         
  365.         c1 = (clData.szName + sizeof(clData.szName) -1);
  366.         while(*c1 == ' ') *c1-- = '\0';
  367.         clData.szName[sizeof(clData.szName)] = '\0';
  368.         
  369.         rc = AddName(WAIT_APP_MODAL, clData.szName, clData.Adapter, hwnd, &clData.cNum);
  370.         
  371.         if(rc != 0)
  372.         {   
  373.             DeleteName(WAIT_WND_MODAL, clData.szName, clData.Adapter, HwnD);     
  374.             rc = AddName(WAIT_APP_MODAL, clData.szName, clData.Adapter, hwnd, &clData.cNum);
  375.         }
  376.         if(rc != 0)
  377.         {   
  378.             net_errno = rc;
  379.             // CL_DEBUG(DB_ACTION, "CLIENT: CONNECT ERROR %s", (LPSTR)WNB_Error());   
  380.             
  381.             HwnD = NULL;
  382.             DestroyWindow(hwnd);
  383.             return FALSE;
  384.         }    
  385.     }        
  386.     return TRUE;
  387.     
  388. }
  389. endConection()
  390. {
  391.     // CL_DEBUG(DB_ACTION, "CLIENT: BYE BYE");
  392.     
  393.     KillTimer(HwnD, 1);    
  394.     
  395.     CancelAllPending(HwnD);
  396.     HangUp(WAIT_APP_MODAL, clData.Adapter, clData.cLSN, HwnD);
  397.     
  398.     SetWindowPos(HwnD, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_HIDEWINDOW);
  399.     
  400.     return TRUE;
  401. }
  402.  
  403. int FAR PASCAL reCommCmd(struct recComData huge * lpComData)
  404. {
  405.     int rc;
  406.     char far * c1;
  407.     
  408.     // CL_DEBUG(DB_ACTION, "CLIENT: CMD %d=%s", lpComData->fnc, (LPSTR)cmd[lpComData->fnc]);
  409.     
  410.     if(CONECTED == FALSE) 
  411.     {    
  412.         // CL_DEBUG(DB_ACTION, "CLIENT: NOT CONECTED");
  413.         
  414.         CancelAllPending(HwnD);
  415.         HangUp(WAIT_APP_MODAL, clData.Adapter, clData.cLSN, HwnD);
  416.         
  417.         if(IsWindow(HwnD) == 0)
  418.         {
  419.             if(initRecomNet() == FALSE)
  420.             {
  421.                 MessageBox(NULL, "ACHTUNG: Es trat ein schwerwiegender\n"
  422.                 "Netzwerkfehler auf. RemoteCommPort ist nicht m÷glich!\n"
  423.                 , APPTITLE, MB_OK|MB_ICONHAND);
  424.                 return FALSE; 
  425.             }
  426.         }   
  427.         if(lpComData->fnc == TRMCOM)
  428.         {
  429.             comData.rc = 0;
  430.             _fmemcpy(lpComData, &comData, sizeof(comData));
  431.             return TRUE;
  432.         }                    
  433.             
  434.         
  435.         if(lpComData->fnc == SETQUE)
  436.         {    // New Connect 
  437.             
  438.             
  439.             if(SetTimer(HwnD, 1, 10, NULL) == NULL)
  440.             {
  441.                 MessageBox(NULL, "ACHTUNG: Alle TimerResourcen sind derzeit belegt.\n"
  442.                 "RemoteCommPort ist momentan nicht m÷glich!\n"
  443.                 , APPTITLE, MB_OK|MB_ICONHAND);
  444.                 
  445.                 endConection();        
  446.                 return FALSE;
  447.             }
  448.             tick = GetTickCount();               
  449.             comData.fnc = CONNECT;
  450.     
  451.             // CL_DEBUG(DB_ACTION, "CLIENT: START CONNECT FOR TASK %d", GetCurrentTask());
  452.             
  453.             CONECTED = FALSE;
  454.     
  455.             if(DialogBox(hLibrary, "HOSTS", NULL, HostDlgProc) == IDOK)
  456.             {   
  457.                 clData.szServer[17] = '\0';
  458.                 c1 = _fstrchr(clData.szServer, '\t');        
  459.                 if(c1 != NULL) *c1 = '\0';
  460.                     
  461.                 if(conectToHost() == TRUE)
  462.                 {
  463.                     CONECTED = TRUE;    
  464.                 }
  465.             }
  466.             if(CONECTED == FALSE)
  467.             {
  468.                     
  469.                 MessageBox(NULL, 
  470.                     "Das Modem ist momentan belegt oder der Server lΣuft nicht.\n"
  471.                     "Die Verbindung kann nicht aufgebaut werden.\n"
  472.                     "Beheben Sie den Fehler und versuchen Sie es spΣter erneut"
  473.                     , APPTITLE, MB_OK|MB_ICONHAND);         
  474.                 
  475.                 KillTimer(HwnD, 1);
  476.                 endConection();
  477.                 
  478.                 return FALSE;
  479.             }
  480.         }else
  481.         {
  482.             return FALSE;
  483.         }
  484.         // CL_DEBUG(DB_ACTION, "CLIENT: CONNECT DONE");
  485.     }           
  486.     tick = GetTickCount();
  487.     
  488.     _fmemcpy(&comData, lpComData, sizeof(comData));
  489.     rc = analizeMessage();            
  490.     _fmemcpy(lpComData, &comData, sizeof(comData));  
  491.     
  492.     return (rc);
  493.     
  494. }        
  495.         
  496. long FAR PASCAL ReCommWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  497. {    
  498.     switch(msg)
  499.     {
  500.     
  501.     case WM_NB_RESPONSE:
  502.         lpNCB = (LPNCB) lParam;
  503.         
  504.         if(lpNCB->cCmdCplt)
  505.         {
  506.             net_errno = lpNCB->cCmdCplt;
  507.             // CL_DEBUG(DB_ACTION, "CLIENT: RESPONSE ERROR %s", (LPSTR)WNB_Error());
  508.             
  509.             CONECTED = FALSE;
  510.             endConection();
  511.             DestroyNCB(lpNCB);
  512.             
  513.             return 0;
  514.         }
  515.         DestroyNCB(lpNCB);
  516.         return 0;
  517.         
  518.     case WM_CREATE:
  519.         HwnD = hwnd;
  520.         memset(¬i, 0, sizeof(noti));
  521.         setReadyFlag();
  522.         // CL_DEBUG(DB_ACTION, "CLIENT: INIT DONE");
  523.         return TRUE; 
  524.             
  525.     case WM_QUERYENDSESSION:
  526.         return 1;
  527.         
  528.     case WM_ENDSESSION:
  529.         exitDll();
  530.         return 1;
  531.         
  532.         
  533.     case WM_SYSCOMMAND:
  534.         if( (wParam == SC_MAXIMIZE) 
  535.         ||    (wParam == SC_RESTORE))
  536.         {
  537.             return 0;
  538.         }
  539.         break;
  540.         
  541.         
  542.     case WM_TIMER:
  543.         tack = GetTickCount();
  544.         if((tack - tick) > 120000)
  545.         {    
  546.             if(CONECTED == TRUE)
  547.             {
  548.                 tick = tack;
  549.                 
  550.                 // CL_DEBUG(DB_ACTION, "CLIENT: RESET BY TIME OUT");
  551.                 
  552.                 if(MessageBox(NULL, "Ein TimeOut ist aufgetreten\n"
  553.                     "Soll ihre Verbindung abgebrochen werden ?",
  554.                     APPTITLE, MB_RETRYCANCEL|MB_ICONHAND) == IDCANCEL)
  555.                 {    
  556.                     CONECTED = FALSE;
  557.                     CloseComm(REMOTE_COM);
  558.                     endConection();                
  559.                 }
  560.             }
  561.         }
  562.         if( ( INTRANS == FALSE)
  563.         &&  ((tack - evtick) > poll))
  564.         {
  565.             if(CONECTED == TRUE)
  566.             {
  567.                 // CL_DEBUG(DB_ACTION, "CLIENT: poll event mask");
  568.                 comData.fnc = GETMASK;
  569.                 analizeMessage();            
  570.                 setReadyFlag(); // neue event mask an comm.drv
  571.             }
  572.         }
  573.         return TRUE;
  574.         
  575.     case WM_COMMAND:
  576.         if(wParam == IDABORT)
  577.         {
  578.             endConection();
  579.         }
  580.         return TRUE;
  581.         
  582.     case WM_CLOSE:
  583.         
  584.         CONECTED = FALSE;
  585.         // CL_DEBUG(DB_ACTION, "CLIENT: DISCONECT");
  586.         endConection();
  587.         DestroyWindow(hwnd);
  588.         return 0;
  589.         
  590.     case WM_DESTROY:                                                    
  591.         NET_INIT = FALSE;
  592.         CancelAllPending(hwnd);
  593.         DeleteName(WAIT_WND_MODAL, clData.szName, clData.Adapter, HwnD);
  594.         return 0;
  595.     }
  596.     return DefWindowProc(hwnd, msg, wParam, lParam);
  597. }
  598. analizeMessage()
  599. {    
  600.     int rc;
  601.     
  602.     // PRE ACTION'S  
  603.     
  604.     // CL_DEBUG(DB_ACTION, "CLIENT: ANALIZE CMD %d=%s", comData.fnc, (LPSTR)cmd[comData.fnc]);
  605.     
  606.     if(comData.fnc == TRMCOM)
  607.     {
  608.         poll = 5000;
  609.         sendCMD();
  610.         comData.rc = 0;
  611.         CONECTED = FALSE;
  612.         endConection();
  613.         return TRUE;
  614.     }
  615.     
  616.     if(comData.fnc == CWSTRING)
  617.     {
  618.         cmdsize[comData.fnc] = SC + comData.len;
  619.     }
  620.     
  621.     rc = sendDgram();
  622.     
  623.     // POST ACTION'S ---------------------
  624.     
  625.     if(event != comData.evmask)
  626.     {
  627.         if(noti.hwnd != NULL)
  628.         {    
  629.             PostMessage(noti.hwnd, WM_COMMNOTIFY, REMOTE_COM, 
  630.                 MAKELONG(comData.evmask, 0));    
  631.                 
  632.             // CL_DEBUG(DB_ACTION, "CLIENT: WM_COMMNOTIFY %d", comData.evmask);
  633.         }   
  634.     }
  635.     event = comData.evmask;
  636.     
  637.     if(comData.fnc == INICOM)
  638.     {
  639.         REMOTE_COM = comData.a.dcb.Id;
  640.     }
  641.     if(comData.fnc == CEVTGET)
  642.     {    
  643.         event = comData.evmask;
  644.     }
  645.     if(comData.fnc == ENABLENOTI)
  646.     {
  647.         _fmemcpy(¬i, &comData.a.noti, sizeof(noti));
  648.         if(comData.a.noti.hwnd == NULL)
  649.         {
  650.             poll = 5000;
  651.         }else         
  652.         {
  653.             poll = 100;
  654.         }
  655.     }                           
  656.     // CL_DEBUG(DB_ACTION, "CLIENT: rc=%d net_rc=%lu ev=%d", rc, comData.rc, event);
  657.     
  658.     return rc;
  659. }    
  660.  
  661.  
  662. sendDgram()
  663. {       
  664.     if(sendCMD() == 0)
  665.     {
  666.         while(readAnswer() == IDRETRY)
  667.         {
  668.             if(sendCMD() == FALSE)
  669.             {
  670.                 return FALSE;
  671.             }
  672.         }
  673.     }else
  674.     {
  675.         return FALSE;
  676.     }    
  677.     return TRUE;
  678. }
  679. readAnswer()
  680. {
  681.     int rc;     
  682.     int len;
  683.     
  684.     evtick = tick = GetTickCount();
  685.     INTRANS = TRUE;
  686.                              
  687.     len = sizeof(comData);
  688.                                  
  689.     // rc = ReceiveDatagram(WAIT_APP_MODAL, clData.Adapter, clData.cNum, 
  690.     //         (LPSTR)&comData, (LPWORD)&len, HwnD, clData.szServer);
  691.             
  692.     rc = Receive(WAIT_APP_MODAL, clData.Adapter, clData.cLSN, 
  693.             (LPSTR)&comData, (LPWORD)&len, HwnD);
  694.         
  695.     if(rc != 0)
  696.     {
  697.         net_errno = rc;
  698.         
  699.         // CL_DEBUG(DB_ACTION, "CLIENT(%s): READ %s", (LPSTR)cmd[comData.fnc], (LPSTR)WNB_Error());
  700.             
  701.         rc = ERROR_MSG("READ DATA");
  702.         
  703.         if(rc == IDABORT)
  704.         {
  705.             // CL_DEBUG(DB_ACTION, "CLIENT(%s): BREAKING", (LPSTR)cmd[comData.fnc]);
  706.             
  707.             CONECTED = FALSE;
  708.             INTRANS = FALSE;
  709.             endConection();
  710.             return IDABORT;
  711.         }    
  712.         if(rc == IDRETRY) 
  713.         {   INTRANS = FALSE;
  714.             return(IDRETRY); // Retry
  715.         }
  716.         // Ignore
  717.     }                       
  718.     INTRANS = FALSE;
  719.     evtick = tick = GetTickCount();
  720.     return 0;
  721. }
  722.  
  723. sendCMD()
  724. {
  725.     int rc;
  726.                                     
  727. RETRY:                                    
  728.     
  729.     evtick = tick = GetTickCount();
  730.     INTRANS = TRUE;    
  731.     
  732.     // rc = SendDatagram(WAIT_APP_MODAL, clData.Adapter, clData.cNum, clData.szServer,
  733.     //               (LPSTR)&comData, cmdsize[comData.fnc], HwnD);
  734.         
  735.     rc = Send(WAIT_APP_MODAL, clData.Adapter, clData.cLSN, 
  736.         (LPSTR)&comData, cmdsize[comData.fnc], HwnD);
  737.         
  738.     if(rc != 0)
  739.     {
  740.         net_errno = rc;
  741.         
  742.         // CL_DEBUG(DB_ACTION, "CLIENT(%s): SEND %s", (LPSTR)cmd[comData.fnc], (LPSTR)WNB_Error());
  743.             
  744.         rc = ERROR_MSG("SEND DATA");
  745.             
  746. // Abort --------------------------
  747.         if(rc == IDABORT)
  748.         {
  749.             // CL_DEBUG(DB_ACTION, "CLIENT(%s): BREAKING", (LPSTR)cmd[comData.fnc]);
  750.             CONECTED = FALSE;
  751.             endConection();  
  752.             INTRANS = FALSE;
  753.             return IDABORT;
  754.         }                      
  755. // Retry --------------------------              
  756.         if(rc == IDIGNORE) goto RETRY;        
  757.  
  758. // Ignore --------------------------                      
  759.     }   
  760.     evtick = tick = GetTickCount();
  761.     INTRANS = FALSE;
  762.     
  763.     return 0;
  764. }
  765. initDll()
  766. {
  767.     
  768.     WNDCLASS wndclass;
  769.     
  770.     lstrcpy(szAppName, APPNAME);
  771.     
  772.     wndclass.style = CS_HREDRAW |CS_VREDRAW;
  773.     wndclass.lpfnWndProc = ReCommWndProc;
  774.     wndclass.cbClsExtra = 0;
  775.     wndclass.cbWndExtra = 0;
  776.     wndclass.hInstance = hLibrary;
  777.     wndclass.hIcon = LoadIcon(hLibrary, "recomm_ico");
  778.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  779.     wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  780.     wndclass.lpszMenuName = NULL;
  781.     wndclass.lpszClassName = szAppName;
  782.     
  783.     RegisterClass(&wndclass);
  784.     
  785.     return TRUE;
  786. }
  787. void exitDll()
  788. {
  789.     ;
  790. }
  791.  
  792.